package com.xiongxiong.yiqing.util;


import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.xiongxiong.yiqing.config.file.WebAppDataProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description 文件操作
 * @Author 小乌龟
 * @Date 2022/2/17 14:08
 */
@Slf4j
@Component
public class FileUtil {
    /**
     * 工具类注入bean
     *
     * @author zhangjunrong
     * @date 2022/2/22 19:30
     */
    @Autowired
    private WebAppDataProperties webAppDataProperties;

    private static FileUtil fileUtil;

    @PostConstruct
    public void init() {
        fileUtil = this;
        fileUtil.webAppDataProperties = this.webAppDataProperties;

    }


    /**
     * 图片类型
     */
    private static List<String> pictureTypes = new ArrayList<>();

    static {
        pictureTypes.add("jpg");
        pictureTypes.add("jpeg");
        pictureTypes.add("bmp");
        pictureTypes.add("gif");
        pictureTypes.add("png");
    }
    /**
     * 视频类型 FLV 、AVI、MOV、MP4、WMV
     */
    private static List<String> videoTypes = new ArrayList<>();
    static {
        videoTypes.add("mp4");
        videoTypes.add("flv");
        videoTypes.add("wmv");
        videoTypes.add("mov");
        videoTypes.add("avi");
    }


    public static File getWebAppFilePath(String root, String filePath) {
        String imageDir = root + "file/" + filePath;
        File imageDirFile = getOrCreate(imageDir);
        return imageDirFile;
    }

    private static File getOrCreate(String path) {
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        return file;
    }

    /**
     * 判断是否是图片/视频
     *
     * @param fileName
     * @return
     */
    public static Boolean isFile(String fileName, int type) {
        if (StrUtil.isEmpty(fileName)) {
            return false;
        }
        String expandName = getFileExpandedName(fileName,type );
        return pictureTypes.contains(expandName);
    }



    /**
     * 下载图片 可判定是否是图片
     *
     * @param srcImage 图片文件
     * @param filePath 图片路径 默认有 /home/rich/upload/img/ 如填 article
     * @return String  img/xxx/xxx.png 如 img/article/123.png
     * @author zhangjunrong
     * @date 2022/2/22 21:48
     */
    public static String uploadImage(MultipartFile srcImage, String filePath) {
        // 获取上传时的文件名
        String imageName = srcImage.getOriginalFilename();

        if (isFile(imageName,0)) {
            // 截取后缀
//            String imageSuffix = imageName.substring(imageName.lastIndexOf("."));
            // 图片的存储路径
            File imagePath = getWebAppFilePath(fileUtil.webAppDataProperties.getMappingLocation(), filePath);
            // 使用雪压算法作为保存时的文件名
            String newImageName = IdUtil.getSnowflake(16).nextId()+"." + getFileExpandedName(imageName,0 );
            File destImage = new File(imagePath, newImageName);
            try {
                srcImage.transferTo(destImage);
                //压缩图片 hutool仅支持jpg压缩
                ImgUtil.compress(destImage, destImage, 0.5f);
            } catch (IOException e) {
                e.printStackTrace();
            }

            StringBuilder imageUrl = new StringBuilder()
                    .append("file/")
                    .append(filePath)
                    .append("/")
                    .append(newImageName);
            return imageUrl.toString();
        }
        return null;

    }
    /**
     * 下载图片 可判定是否是图片
     *
     * @param video 视频文件
     * @param filePath 图片路径 默认有 /home/rich/upload/img/ 如填 article
     * @return String  img/xxx/xxx.png 如 img/article/123.png
     * @author zhangjunrong
     * @date 2022/2/22 21:48
     */
    public static String uploadVideo(MultipartFile video, String filePath) {
        // 获取上传时的文件名
        String videoName = video.getOriginalFilename();
        System.err.println(videoName);
        if (isFile(videoName,1)) {
            // 视频的存储路径
            File videoPath = getWebAppFilePath(fileUtil.webAppDataProperties.getMappingLocation(), filePath);
            // 使用雪压算法作为保存时的文件名
            String newVideoName = IdUtil.getSnowflake(16).nextId() + ".mp4";
            File destVideo = new File(videoPath, newVideoName);
            try {
                //下载视频
                video.transferTo(destVideo);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //填充视频路径返回
            StringBuilder videoUrl = new StringBuilder()
                    .append("file/")
                    .append(filePath)
                    .append("/")
                    .append(newVideoName);
            return videoUrl.toString();
        }
        return null;

    }

    /**
     * 图片删除 以提供路径 home/yqs/upload/ 需要 类型/文件名 如 img/article/1.png
     *
     * @param filePath
     * @return boolean
     * @author zhangjunrong
     * @date 2022/2/23 16:16
     */
    public static boolean deleteFile(String filePath) {
        return delFile(fileUtil.webAppDataProperties.getMappingLocation() + filePath);
    }


    /**
     * 删除单个文件
     *
     * @param fileName 要删除的文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean delFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                log.info("删除单个文件" + fileName + "成功！");
                return true;
            } else {
                log.error("删除单个文件" + fileName + "失败！");
                return false;
            }
        } else {
            log.info("删除单个文件失败：" + fileName + "不存在！");
            return false;
        }
    }

    /**
     * 获取后缀名 如果没有按mp4/jpg格式来
     *
     * @param fileName
     * @param type 0 图片 1 视频
     * @return
     */
    public static String getFileExpandedName(String fileName, int type) {
        String ext = "";
        if (StrUtil.isNotBlank(fileName) &&
                StrUtil.contains(fileName, ".")) {
            ext = StrUtil.subSuf(fileName, fileName.lastIndexOf(".") + 1);
        }
        ext = ext.toLowerCase();
        if (ext == null || ext.length() < 1) {
            if (type==1){
                ext="mp4";
            }else if(type==0){
                ext="jpg";
            }
        }
        return ext;
    }


}